////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Ακολουθεί δευτερεύων server προς εξυπηρέτηση αιτημάτων ελέγχου των δεδομένων τού
// πρωτεύοντος server. Αυτός ο server "ακούει" σε διαφορετική πόρτα και επιστρέφει
// ολόκληρο το σκηνικό του server σε ψευδοjson format.

Monitor = {};

Monitor.oriste = function() {
	var t, x, i;

	Log.print('listening port ' + globals.monitorPort + ' for monitor requests');

	Monitor.server = Server.http.createServer(function(request, response) {
		if (Server.url.parse(request.url, true).pathname == '/favicon.ico') {
			response.end();
			return;
		}

		response.writeHead(200, {
			'Content-type': 'text/plain',
		});

		t = 'database connections: [\n'; x = '';
		for (i = 0; i < DB.pool.length; i++) {
			response.write(t);
			DB.pool[i].monitor(response);
			t = ',\n'; x = '\n]\n';
		}
		response.write(x);

		t = 'database connections\' free stack: [\n\t'; x = '';
		for (i = 0; i < DB.freeStack.length; i++) {
			response.write(t + i);
			t = ',\n\t'; x = '\n]\n';
		}
		response.write(x);

		t = 'pektis: {\n'; x = '';
		Skiniko.pektisWalk(function(login, pektis) {
			response.write(t);
			pektis.monitor(response);
			t = ''; x = '}\n';
		});
		response.write(x);

		t = 'sinedria: {\n'; x = '';
		Skiniko.sinedriaWalk(function(pektis, sinedria) {
			response.write(t);
			sinedria.monitor(response);
			t = ''; x = '}\n';
		});
		response.write(x);

		t = 'trapezi: {\n'; x = '';
		Skiniko.trapeziWalk(function(kodikos, trapezi) {
			response.write(t);
			trapezi.monitor(response);
			t = ''; x = '}\n';
		});
		response.write(x);

		t = 'prosklisi: {\n\t'; x = '';
		Skiniko.prosklisiWalk(function(kodikos, prosklisi) {
			response.write(t);
			prosklisi.monitor(response);
			t = '\t'; x = '}\n';
		});
		response.write(x);

		t = 'sizitisi: [\n\t'; x = '';
		Skiniko.sizitisiWalk(function(i, sizitisi) {
			response.write(t);
			sizitisi.monitor(response);
			t = '\t'; x = ']\n';
		});
		response.write(x);

		t = 'kinisi: [\n'; x = '';
		Skiniko.kinisiWalk(function(idx, kinisi) {
			response.write(t);
			kinisi.monitor(response, idx);
			t = ''; x = ']\n';
		});
		response.write(x);

		response.end();
	}).listen(globals.monitorPort);

	Monitor.close = function() {
		if (Monitor.hasOwnProperty('server')) {
			Log.print('stop listening port ' + globals.monitorPort);
			Monitor.server.close();
		}
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "DBSindesi" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στις database connections.

DBSindesi.prototype.monitor = function(rsp) {
	rsp.write('\t' + this.index + ': {\n' +
		'\t\tactive: ' + this.active + '\n' +
		'\t\taction: ' + this.action + '\n' +
		'\t}');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Pektis" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στους παίκτες. Η μέθοδος "monitor" εκτυπώνει τα στοιχεία του παίκτη.

Pektis.prototype.monitor = function(rsp) {
	rsp.write('\t' + this.login + ': {\n' +
		'\t\tonoma: ' + this.onoma + '\n' +
		'\t\tused: ' + this.used + '\n');
	this.monitorPeparam(rsp, this.peparam);
	this.monitorSxesi(rsp, this.sxesi);
	this.monitorProfinfo(rsp, this.profinfo);
	rsp.write('\t}\n');
}

// Η μέθοδος "monitorPeparam" εκτυπώνει τις παραμέτρους του παίκτη.

Pektis.prototype.monitorPeparam = function(rsp) {
	var t = '\t\tpeparam: {\n'; var x = '';
	for (var i in this.peparam) {
		rsp.write(t + '\t\t\t' + i + ': ' + this.peparam[i] + '\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorSxesi" εκτυπώνει τις σχέσεις του παίκτη.

Pektis.prototype.monitorSxesi = function(rsp) {
	var t = '\t\tsxesi: {\n'; var x = '';
	for (var i in this.sxesi) {
		rsp.write(t + '\t\t\t' + i + ': ' + this.sxesi[i].sxetizomenos +
			' [' + this.sxesi[i].sxesi + ']\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorProfinfo" εκτυπώνει τις παρατηρήσεις προφίλ του παίκτη.

Pektis.prototype.monitorProfinfo = function(rsp) {
	var t = '\t\tprofinfo: {\n'; var x = '';
	for (var i in this.profinfo) {
		var s = this.profinfo[i];
		if (s.length > 50) s = s.substr(0, 50) + '…';
		s = s.replace(/\n/g, '\\n').replace(/\r/g, '');
		rsp.write(t + '\t\t\t' + i + ': ' + s + '\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Sinedria" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στις συνεδρίες. Η μέθοδος "monitor" εκτυπώνει τα στοιχεία της συνεδρίας.

Sinedria.prototype.monitor = function(rsp) {
	rsp.write('\t' + this.pektis + ': {\n' +
		'\t\tklidi: ' + this.klidi + '\n' +
		'\t\tisodos: ' + this.isodos + '\n' +
		'\t\tip: ' + (!this.ip ? 'unknown' : this.ip) + '\n' +
		'\t\tpoll: ' + this.poll + '\n' +
		'\t\tdbpoll: ' + this.dbpoll + '\n');
	if (this.isFeredata()) rsp.write('\t\tkinisi: ' + this.kinisi + '\n');
	if (this.isTrapezi()) {
		rsp.write('\t\ttrapezi: ' + this.trapezi + '\n' +
			'\t\tthesi: ' + this.thesi + '\n');
		if (this.isTheatis()) rsp.write('\t\ttheatis: ΝΑΙ' + '\n');
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Trapezi" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στις τραπέζια. Η μέθοδος "monitor" εκτυπώνει τα στοιχεία του τραπεζιού.

Trapezi.prototype.monitor = function(rsp) {
	rsp.write('\t' + this.kodikos + ': {\n' +
		'\t\tpektis1: ' + this.pektis1 + '\n' +
		'\t\tapodoxi1: ' + this.apodoxi1 + '\n' +
		'\t\tpektis2: ' + this.pektis2 + '\n' +
		'\t\tapodoxi2: ' + this.apodoxi2 + '\n' +
		'\t\tpektis3: ' + this.pektis3 + '\n' +
		'\t\tapodoxi3: ' + this.apodoxi3 + '\n' +
		'\t\tstisimo: ' + parseInt(this.stisimo) + '\n' +
		'\t\tpoll: ' + parseInt(this.poll) + '\n');
	this.monitorTrparam(rsp);
	this.monitorProsklisi(rsp);
	this.monitorTheatis(rsp);
	this.monitorSizitisi(rsp);
	this.monitorDianomi(rsp);
	rsp.write('\t}\n');
}

// Η μέθοδος "monitorTrparam" εκτυπώνει τις παραμέτρους του τραπεζιού.

Trapezi.prototype.monitorTrparam = function(rsp) {
	var t = '\t\ttrparam: {\n'; var x = '';
	for (var i in this.trparam) {
		rsp.write(t + '\t\t\t' + i + ': ' + this.trparam[i] +
			' (' + Prefadoros.trparamDecode(i, this.trparam[i]) + ')' + '\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorProsklisi" εκτυπώνει τις προσκλήσεις του τραπεζιού.

Trapezi.prototype.monitorProsklisi = function(rsp) {
	var t = '\t\tprosklisi: {\n'; var x = '';
	for (var i in this.prosklisi) {
		rsp.write(t + '\t\t\t' + i + ', ' + this.prosklisi[i].apo + ', ' +
			this.prosklisi[i].pros + ', ' + this.prosklisi[i].epidosi + '\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorTheatis" εκτυπώνει τους θεατές του τραπεζιού.

Trapezi.prototype.monitorTheatis = function(rsp) {
	var t = '\t\ttheatis: {\n';
	var x = '';
	for (var i in this.theatis) {
		rsp.write(t + '\t\t\t' + i + ': ' + this.theatis[i] + '\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorSizitisi" εκτυπώνει τη συζήτηση του τραπεζιού.

Trapezi.prototype.monitorSizitisi = function(rsp) {
	var t = '\t\tsizitisi: {\n';
	var x = '';
	for (var i = 0; i < this.sizitisi.length; i++) {
		rsp.write(t + '\t\t\t{' +
			this.sizitisi[i].pektis + ', ' + this.sizitisi[i].kimeno + '}\n');
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

// Η μέθοδος "monitorDianomi" εκτυπώνει τις διανομές του τραπεζιού.

Trapezi.prototype.monitorDianomi = function(rsp) {
	var t = '\t\tdianomi: {\n';
	var x = '';
	for (var i = 0; i < this.dianomi.length; i++) {
		rsp.write(t + '\t\t\t' + this.dianomi[i].kodikos);
		this.dianomi[i].monitorEnergia(rsp);
		t = ''; x = '\t\t}\n';
	}
	rsp.write(x);
}

Dianomi.prototype.monitorEnergia = function(rsp) {
	var i, x, xx;

	if (!this.hasOwnProperty('energia')) {
		rsp.write('\n');
		return;
	}

	x = ' {\n';
	for (i = 0; i < this.energia.length; i++) {
		rsp.write(x);
		this.energia[i].monitor(rsp);
		x = ',\n';
	}
	rsp.write('\n\t\t\t}\n');
}

Energia.prototype.monitor = function(rsp) {
	rsp.write('\t\t\t\t' + this.pektis + ', "' + this.idos + '", "' + this.data + '"');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Prosklisi" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στις προσκλήσεις.

Prosklisi.prototype.monitor = function(rsp) {
	rsp.write(this.kodikos + ': {' +
		this.trapezi + ', ' +
		this.apo + ', ' +
		this.pros + ', ' +
		this.epidosi +
	'}\n');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Prosklisi" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στη συζήτηση.

Sizitisi.prototype.monitor = function(rsp) {
	rsp.write('\t' + this.pektis + ': ' + this.kimeno + '\n');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@
//
// Εμπλουτίζουμε την κλάση "Kinisi" με μεθόδους εκτύπωσης στοιχείων που αφορούν
// στις κινήσεις του transaction log.

Kinisi.prototype.monitor = function(rsp, idx) {
	rsp.write('\t' + idx + ': ' + this[':'] + '\n');
}
